package com.idudiao.sc.common.core.util;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class XstreamUtil {

    // xml文件的头信息
    private static final String XML_HEAD = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    // 换行符
    private static final String LINE_BREAK = "\r\n";

    private static XStream getXStream() {
        // DomDriver生成dom形式，StaxDriver生成字符串形式
        return new XStream(new DomDriver("UTF-8"));
    }

    /**
     * 将对象转成xml格式数据
     *
     * @param obj
     * @return String 注：返回值为Boolean,写明true,false含义
     * @author XUSHUAI
     * @date 2018年5月5日
     */
    public static String obj2Xml(Object obj) {
        // 创建XStream
        XStream xstream = getXStream();
        // 使用注解生成
        xstream.autodetectAnnotations(true);
        //
        StringBuffer xmlData = new StringBuffer();
        xmlData.append(XML_HEAD);
        xmlData.append(LINE_BREAK);// 换行符
        xmlData.append(xstream.toXML(obj));// toXML将对象转换成xml格式数据
        //
        return xmlData.toString();
    }

    /**
     * 将xml文件转成bean
     *
     * @param xmlPath xml文件所在路径
     * @param cls     转换后的对象
     * @return Object 注：返回值为Boolean,写明true,false含义
     * @throws Exception
     * @author XUSHUAI
     * @date 2018年5月5日
     */
    public static <T> T xml2Obj(String xmlPath, Class<T> cls) {
        InputStream ins = null;
        try {
            ins = new FileInputStream(new File(xmlPath));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return xml2Obj(ins, cls);
    }

    /**
     * 将文件流转成bean
     *
     * @param ins 文件流
     * @param cls 转换后的对象
     * @return T 注：返回值为Boolean,写明true,false含义
     * @author XUSHUAI
     * @date 2018年6月23日
     */
    public static <T> T xml2Obj(InputStream ins, Class<T> cls) {
        XStream xstream = getXStream();
        xstream.setClassLoader(cls.getClassLoader());
        xstream.processAnnotations(cls);
        //
        return (T) xstream.fromXML(ins);
    }
}
